Widget: Shuffle focus code around
authorTimm Bäder <mail@baedert.org>
Fri, 10 Feb 2017 15:58:17 +0000 (16:58 +0100)
committerTimm Bäder <mail@baedert.org>
Fri, 31 Mar 2017 07:50:40 +0000 (09:50 +0200)
gtk/gtkwidget.c

index f01ebdd9ee936fe3f98cd97e3bacb14353e49df0..ee67492c8ac7d7c58f39c1111d1d7d04b0cef6cb 100644 (file)
@@ -7310,44 +7310,47 @@ static gboolean
 gtk_widget_real_focus (GtkWidget         *widget,
                        GtkDirectionType   direction)
 {
-  if (!gtk_widget_get_can_focus (widget))
+  if (gtk_widget_get_can_focus (widget))
+    {
+      if (!gtk_widget_is_focus (widget))
+        {
+          gtk_widget_grab_focus (widget);
+          return TRUE;
+        }
+    }
+  else
     {
       /* @widget can't be focused, but maybe one of its child widgets. */
       GtkWidget *focus_child = gtk_widget_get_focus_child (widget);
       GtkWidget *child;
 
-      for (child = _gtk_widget_get_first_child (widget);
+      if (focus_child != NULL)
+        {
+          if (gtk_widget_child_focus (focus_child, direction))
+            return TRUE;
+
+          child = focus_child;
+        }
+      else
+        {
+          child = _gtk_widget_get_first_child (widget);
+        }
+
+      /* The current focus child didn't handle the focus, so lets'
+         try all its siblings. If  none of them accepts it, we simply
+         have to return FALSE since we couldn't handle it either. */
+      for (;
            child != NULL;
            child = _gtk_widget_get_next_sibling (child))
         {
-          if (focus_child)
-            {
-              if (focus_child == child)
-                {
-                  focus_child = NULL;
 
-                  if (gtk_widget_child_focus (child, direction))
-                    return TRUE;
-                }
-            }
-          else if (_gtk_widget_is_drawable (child) &&
-                   gtk_widget_is_ancestor (child, widget))
-            {
-              if (gtk_widget_child_focus (child, direction))
-                  return TRUE;
-            }
+          if (_gtk_widget_is_drawable (child) &&
+              gtk_widget_child_focus (child, direction))
+            return TRUE;
         }
-
-      return FALSE;
     }
 
-  if (!gtk_widget_is_focus (widget))
-    {
-      gtk_widget_grab_focus (widget);
-      return TRUE;
-    }
-  else
-    return FALSE;
+  return FALSE;
 }
 
 static void